//
//  JHStatusListViewModel.swift
//  Weibo_SwiftDemo
//
//  Created by gjh on 2021/1/1.
//

import Foundation

/// 微博数据列表视图模型
/// 如果类需要使用 KVC 或者字典转模型,就要继承自 NSObject,
/// 如果类只是包装了一些代码逻辑,写了一些代码函数,可以不用任何父类,轻量级


/// 上拉刷新最大尝试次数
private let maxPullupTryTimes = 3
/// 使命:负责微博的数据处理
/// 1\字典转模型
/// 2\上拉/下拉刷新数据处理
class JHStatusListViewModel {
    
    /// 微博模型数组
    lazy var statusList = [JHHomeStstus]()
    /// 上拉刷新错误次数
    private var pullupErrorTimes = 0
    
    /// 加载微博列表
    /// - Parameters:
    ///   - pullUp: 是否上拉刷新标记
    ///   - completion: 完成回调[网络请求是否成功, 是否还有新的上拉新数据]
    /// - Returns:
    func loadStatus(pullUp: Bool, completion: @escaping(Bool, Bool) -> ()) {
        
        /// 判断是否是上拉刷新,同时检查刷新错误次数
        if pullUp && pullupErrorTimes > maxPullupTryTimes {
            completion(false, false)
            return
        }
        
        // since_id 取出数组中第一条微博的 id
        let since_id = pullUp ? 0 : (statusList.first?.id ?? 0)
        // 上拉刷新,取出数组的最后条微博的 id
        let max_id = !pullUp ? 0 : (statusList.last?.id ?? 0)

        /// 加载微博数据
        JHNetworkManager.instance.statusList(since_id: since_id, max_id: max_id, completion: { (list, isSuccess) in
            /// 1\字典转模型
            // 数组取不出来 已改好 是因为模型属性没有加@objc
            guard let array = NSArray.yy_modelArray(with: JHHomeStstus.self, json: list ?? []) as? [JHHomeStstus]
            else {
                completion(isSuccess, false)
                return
            }
            print("刷新到\(array.count)条数据")
            
            // 2\ 拼接数据 下拉刷新
            if pullUp {
                // 上拉刷新后,将结果拼接在列表的末尾
                self.statusList += array
            } else {
                // 下拉刷新,将结果插入数组前面
                self.statusList = array + self.statusList
            }
            
            // 判断上拉刷新的数据量
            if pullUp && array.count == 0 {
                self.pullupErrorTimes += 1
                completion(isSuccess, false)
            } else {
                // 3\完成回调
                completion(isSuccess, true)
            }
        })
    }
}
